{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "Simple_RNN.ipynb",
      "version": "0.3.2",
      "provenance": []
    },
    "kernelspec": {
      "display_name": "Python [conda root]",
      "language": "python",
      "name": "conda-root-py"
    }
  },
  "cells": [
    {
      "metadata": {
        "id": "cn5CWC0idb_6",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "# Simple RNN\n",
        "\n",
        "In ths notebook, we're going to train a simple RNN to do **time-series prediction**. Given some set of input data, it should be able to generate a prediction for the next time step!\n",
        "<img src='https://github.com/iArunava/Intro-to-Deep-Learning-with-Pytorch-Udacity-Solutions/blob/master/recurrent-neural-networks/time-series/assets/time_prediction.png?raw=1' width=40% />\n",
        "\n",
        "> * First, we'll create our data\n",
        "* Then, define an RNN in PyTorch\n",
        "* Finally, we'll train our network and see how it performs"
      ]
    },
    {
      "metadata": {
        "id": "KsHsSchydcAF",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "### Import resources and create data "
      ]
    },
    {
      "metadata": {
        "id": "PqDbWrPNde5j",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 141
        },
        "outputId": "314e4c27-3e0b-4ef7-c22e-40cda7041703"
      },
      "cell_type": "code",
      "source": [
        "!pip install torch"
      ],
      "execution_count": 1,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Collecting torch\n",
            "\u001b[?25l  Downloading https://files.pythonhosted.org/packages/56/92/419c6959c0c427909994f019c039bf963354fe50153fa3a41094782b3a43/torch-1.0.0-cp27-cp27mu-manylinux1_x86_64.whl (591.8MB)\n",
            "\u001b[K    100% |████████████████████████████████| 591.8MB 20kB/s \n",
            "tcmalloc: large alloc 1073750016 bytes == 0x559475d32000 @  0x7f46fc5282a4 0x559414222f18 0x559414316a85 0x5594142364ca 0x55941423b232 0x559414233d0a 0x55941423b5fe 0x559414233d0a 0x55941423b5fe 0x559414233d0a 0x55941423b5fe 0x559414233d0a 0x55941423bc38 0x559414233d0a 0x55941423b5fe 0x559414233d0a 0x55941423b5fe 0x55941423b232 0x55941423b232 0x559414233d0a 0x55941423bc38 0x55941423b232 0x559414233d0a 0x55941423bc38 0x559414233d0a 0x55941423bc38 0x559414233d0a 0x55941423b5fe 0x559414233d0a 0x559414233629 0x55941426461f\n",
            "\u001b[?25hInstalling collected packages: torch\n",
            "Successfully installed torch-1.0.0\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "4Knwb-zKdcAJ",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "import torch\n",
        "from torch import nn\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "%matplotlib inline"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "8GGp8yFTdcAW",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 320
        },
        "outputId": "010063bf-cad1-47e2-8bc9-733f78c2d1f3"
      },
      "cell_type": "code",
      "source": [
        "plt.figure(figsize=(8,5))\n",
        "\n",
        "# how many time steps/data pts are in one batch of data\n",
        "seq_length = 20\n",
        "\n",
        "# generate evenly spaced data pts\n",
        "time_steps = np.linspace(0, np.pi, seq_length + 1)\n",
        "data = np.sin(time_steps)\n",
        "data.resize((seq_length + 1, 1)) # size becomes (seq_length+1, 1), adds an input_size dimension\n",
        "\n",
        "x = data[:-1] # all but the last piece of data\n",
        "y = data[1:] # all but the first\n",
        "\n",
        "# display the data\n",
        "plt.plot(time_steps[1:], x, 'r.', label='input, x') # x\n",
        "plt.plot(time_steps[1:], y, 'b.', label='target, y') # y\n",
        "\n",
        "plt.legend(loc='best')\n",
        "plt.show()"
      ],
      "execution_count": 3,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nHfzLv/TPSdspbm3odLQ0ST4P/f17sr1YRYIrBs0nc1LTasPtXNd29alPfYLBwW186Ut/yxve8Eau\nvPJyABYtGueSSy7n8MNfzNvedjYrVryEk08+hUMOOYxNm67hoIP+A0ceeRQHHnggGza8m+uv/xz3\n3PMTxsZGectb/piTTjpl1lsbXn75h3jjG8/mpJNO5tlnn+Xtb38rN974dXK5fY9Sj4SlKSYuVpHp\nPn3iYhVtGhRzUtNqw+1c11aR5Rfz/uRPzuPlLz+RCy54F4899igXXPAurr32es455xxuuun/ALBj\nx684//x3ctZZb+a6667lox/9H3zqU9dSLEYA7r77xzzyyK/53Of+ls985vP83d99ka6uA1i//ize\n+ta3TRvAAH19Z3L77f8MwMDAnaxZ88qGAhg8EpYkzaE5+2IecNBBB/PpT/8NN9xwPU899STHHVc5\nPbH//gdw7LGVW9s/8sjDrFjxEgDWrHklo6Oj/PSnd7Nt20+56KI/A2B8fIxHH3101tc75ZRTue66\nTZTLZe6447uZXOLSEJYkzZnpvpiX1WVRb7jhek45ZQ1vfvO5DAx8n29/u3KUut9+00fbxC0N99tv\nP846602cd94FL+j1crkcq1ev4Uc/upP779/OCSe8rLFfAKejJUlzKOsv5k2+/eBvfvMbDj/8xYyP\nj3P77bfz3HPPPW/7gw46mAcffIDR0VG2bv0hAMcffwLf//4djI2N8cwzz7Bx49XPa3smfX1ncsMN\nn+cVr+ht6PeY4JGwJGnOZP3FvKOOOoYY/51Nm67hTW96Cxs3fpJDD13Ohg3nc9llH+HOO39Qs/27\n3vUeLrvsgxx22HKOOupoOjs7eelL/yOveEUv7373BcA4Z5/9VmD2WxsCvOQlK3niiSf4wz98fWO/\nSJW3MkzIW5HVsh61rEct61HLetSaqR533vkDjjjiSA47bDlXX30VL395L6973ewBOtOtDR966EGu\nueYTfOYz//OF9s9bGUqS2sv4+Dgf/vAH6OpaTHf3QbzmNevq+rnpbm14yy1f4xvfuJnLLvtYZv3z\nSDghP8nWsh61rEct61HLetSa7/WY6UjYL2ZJkpSIISxJUiKGsFqatx1sb/791er8YpZalrcdbG/+\n/bUQeCSsluVtB9ubf38tBIawWpa3HWxv/v21EDgdrZblbQfbm39/LQSGsFraxC3ysm603Ls62zY1\n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\nJOIAAAAASUVORK5CYII=\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7f7c62ef5250>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "metadata": {
        "id": "saqYU4cydcAj",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "---\n",
        "## Define the RNN\n",
        "\n",
        "Next, we define an RNN in PyTorch. We'll use `nn.RNN` to create an RNN layer, then we'll add a last, fully-connected layer to get the output size that we want. An RNN takes in a number of parameters:\n",
        "* **input_size** - the size of the input\n",
        "* **hidden_dim** - the number of features in the RNN output and in the hidden state\n",
        "* **n_layers** - the number of layers that make up the RNN, typically 1-3; greater than 1 means that you'll create a stacked RNN\n",
        "* **batch_first** - whether or not the input/output of the RNN will have the batch_size as the first dimension (batch_size, seq_length, hidden_dim)\n",
        "\n",
        "Take a look at the [RNN documentation](https://pytorch.org/docs/stable/nn.html#rnn) to read more about recurrent layers."
      ]
    },
    {
      "metadata": {
        "id": "reOqFLH2dcAm",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "class RNN(nn.Module):\n",
        "    def __init__(self, input_size, output_size, hidden_dim, n_layers):\n",
        "        super(RNN, self).__init__()\n",
        "        \n",
        "        self.hidden_dim=hidden_dim\n",
        "\n",
        "        # define an RNN with specified parameters\n",
        "        # batch_first means that the first dim of the input and output will be the batch_size\n",
        "        self.rnn = nn.RNN(input_size, hidden_dim, n_layers, batch_first=True)\n",
        "        \n",
        "        # last, fully-connected layer\n",
        "        self.fc = nn.Linear(hidden_dim, output_size)\n",
        "\n",
        "    def forward(self, x, hidden):\n",
        "        # x (batch_size, seq_length, input_size)\n",
        "        # hidden (n_layers, batch_size, hidden_dim)\n",
        "        # r_out (batch_size, time_step, hidden_size)\n",
        "        batch_size = x.size(0)\n",
        "        \n",
        "        # get RNN outputs\n",
        "        r_out, hidden = self.rnn(x, hidden)\n",
        "        # shape output to be (batch_size*seq_length, hidden_dim)\n",
        "        r_out = r_out.view(-1, self.hidden_dim)  \n",
        "        \n",
        "        # get final output \n",
        "        output = self.fc(r_out)\n",
        "        \n",
        "        return output, hidden\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "kFcHcmNadcAu",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "### Check the input and output dimensions\n",
        "\n",
        "As a check that your model is working as expected, test out how it responds to input data."
      ]
    },
    {
      "metadata": {
        "id": "uvfmRHz-dcA2",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 69
        },
        "outputId": "6bb9fd0e-af34-42a2-88fb-6fc6b291599a"
      },
      "cell_type": "code",
      "source": [
        "# test that dimensions are as expected\n",
        "test_rnn = RNN(input_size=1, output_size=1, hidden_dim=10, n_layers=2)\n",
        "\n",
        "# generate evenly spaced, test data pts\n",
        "time_steps = np.linspace(0, np.pi, seq_length)\n",
        "data = np.sin(time_steps)\n",
        "data.resize((seq_length, 1))\n",
        "\n",
        "test_input = torch.Tensor(data).unsqueeze(0) # give it a batch_size of 1 as first dimension\n",
        "print('Input size: ', test_input.size())\n",
        "\n",
        "# test out rnn sizes\n",
        "test_out, test_h = test_rnn(test_input, None)\n",
        "print('Output size: ', test_out.size())\n",
        "print('Hidden state size: ', test_h.size())"
      ],
      "execution_count": 5,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "('Input size: ', torch.Size([1, 20, 1]))\n",
            "('Output size: ', torch.Size([20, 1]))\n",
            "('Hidden state size: ', torch.Size([2, 1, 10]))\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "QoVH4tY3dcA7",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "---\n",
        "## Training the RNN\n",
        "\n",
        "Next, we'll instantiate an RNN with some specified hyperparameters. Then train it over a series of steps, and see how it performs."
      ]
    },
    {
      "metadata": {
        "id": "lr_-DRG2dcA-",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 86
        },
        "outputId": "21ff2987-e9dc-4125-904a-7f4e6145373c"
      },
      "cell_type": "code",
      "source": [
        "# decide on hyperparameters\n",
        "input_size=1 \n",
        "output_size=1\n",
        "hidden_dim=32\n",
        "n_layers=1\n",
        "\n",
        "# instantiate an RNN\n",
        "rnn = RNN(input_size, output_size, hidden_dim, n_layers)\n",
        "print(rnn)"
      ],
      "execution_count": 6,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "RNN(\n",
            "  (rnn): RNN(1, 32, batch_first=True)\n",
            "  (fc): Linear(in_features=32, out_features=1, bias=True)\n",
            ")\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "DwQNH1v7dcBK",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "### Loss and Optimization\n",
        "\n",
        "This is a regression problem: can we train an RNN to accurately predict the next data point, given a current data point?\n",
        "\n",
        ">* The data points are coordinate values, so to compare a predicted and ground_truth point, we'll use a regression loss: the mean squared error.\n",
        "* It's typical to use an Adam optimizer for recurrent models."
      ]
    },
    {
      "metadata": {
        "id": "D2ByznYPdcBO",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "# MSE loss and Adam optimizer with a learning rate of 0.01\n",
        "criterion = nn.MSELoss()\n",
        "optimizer = torch.optim.Adam(rnn.parameters(), lr=0.01) "
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "WHrwFdQddcBZ",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "### Defining the training function\n",
        "\n",
        "This function takes in an rnn, a number of steps to train for, and returns a trained rnn. This function is also responsible for displaying the loss and the predictions, every so often.\n",
        "\n",
        "#### Hidden State\n",
        "\n",
        "Pay close attention to the hidden state, here:\n",
        "* Before looping over a batch of training data, the hidden state is initialized\n",
        "* After a new hidden state is generated by the rnn, we get the latest hidden state, and use that as input to the rnn for the following steps"
      ]
    },
    {
      "metadata": {
        "id": "wLYY9gcldcBc",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "# train the RNN\n",
        "def train(rnn, n_steps, print_every):\n",
        "    \n",
        "    # initialize the hidden state\n",
        "    hidden = None      \n",
        "    \n",
        "    for batch_i, step in enumerate(range(n_steps)):\n",
        "        # defining the training data \n",
        "        time_steps = np.linspace(step * np.pi, (step+1)*np.pi, seq_length + 1)\n",
        "        data = np.sin(time_steps)\n",
        "        data.resize((seq_length + 1, 1)) # input_size=1\n",
        "\n",
        "        x = data[:-1]\n",
        "        y = data[1:]\n",
        "        \n",
        "        # convert data into Tensors\n",
        "        x_tensor = torch.Tensor(x).unsqueeze(0) # unsqueeze gives a 1, batch_size dimension\n",
        "        y_tensor = torch.Tensor(y)\n",
        "\n",
        "        # outputs from the rnn\n",
        "        prediction, hidden = rnn(x_tensor, hidden)\n",
        "\n",
        "        ## Representing Memory ##\n",
        "        # make a new variable for hidden and detach the hidden state from its history\n",
        "        # this way, we don't backpropagate through the entire history\n",
        "        hidden = hidden.data\n",
        "\n",
        "        # calculate the loss\n",
        "        loss = criterion(prediction, y_tensor)\n",
        "        # zero gradients\n",
        "        optimizer.zero_grad()\n",
        "        # perform backprop and update weights\n",
        "        loss.backward()\n",
        "        optimizer.step()\n",
        "\n",
        "        # display loss and predictions\n",
        "        if batch_i%print_every == 0:        \n",
        "            print('Loss: ', loss.item())\n",
        "            plt.plot(time_steps[1:], x, 'r.') # input\n",
        "            plt.plot(time_steps[1:], prediction.data.numpy().flatten(), 'b.') # predictions\n",
        "            plt.show()\n",
        "    \n",
        "    return rnn\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "S1TWSQyJdcBm",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1344
        },
        "outputId": "5ac92002-ced1-4ef9-8880-cd09982ab5f8"
      },
      "cell_type": "code",
      "source": [
        "# train the rnn and monitor results\n",
        "n_steps = 75\n",
        "print_every = 15\n",
        "\n",
        "trained_rnn = train(rnn, n_steps, print_every)"
      ],
      "execution_count": 9,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "('Loss: ', 0.5709128975868225)\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7f7c62ec71d0>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "('Loss: ', 0.017703436315059662)\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7f7c605d6190>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "('Loss: ', 0.004094313830137253)\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nDwAAAABJRU5ErkJggg==\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7f7c60554510>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "('Loss: ', 0.0003116609004791826)\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nRK5CYII=\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7f7c60525690>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "('Loss: ', 0.0006933535914868116)\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nYII=\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7f7c60e68290>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "metadata": {
        "id": "dJ_wneMpdcBr",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "### Time-Series Prediction\n",
        "\n",
        "Time-series prediction can be applied to many tasks. Think about weather forecasting or predicting the ebb and flow of stock market prices. You can even try to generate predictions much further in the future than just one time step!"
      ]
    }
  ]
}